flavor type
TypeScriptで同じ構造の型を区別するする方法の1つ
TypeScriptの文脈の一部でのみ使われている名称
モチベーション
branded typesは、const userId: UserId = 3のように
UserId型には3のようなただの数値も代入できなくなるぐらい厳しい
GraphQLなどのコード生成時に問題になるとのこと ref
branded typesより少し緩い型を使いたい
Flavor型の定義例
code:ts
type Flavor<T, U extends string> = T & { _type?: U };
よくあるbranded typesの定義の_typeをoptionalにするだけ
使用例
code:ts
type UserId = Flavor<number, "UserIde">
以下のような操作が可能
code:ts
const userId: UserId = 1
同じ方法で定義した、UserIdとPostIdなどはちゃんと区別される
constructorを通さなくても、その型の値を生成できてしまうということ
これ、そもそも問題としてることがいまいちわからないなmrsekut.icon
branded typesを「構造が同じでも区別したい」という理由だけで使っていると問題と捉えてしまいそうなのはわかる
「branded typesはsmart constructorと組み合わすことで発揮される」と捉えるならば、flavor typeは不要だと思う
でもまあそういう需要はあるのだと思う、しらんけど
参考
Need Flexible Nominal Typing for TypeScript? Use Flavoring, not Branding